// Presentation.java
package exercise.jslide.jslide.model;

import exercise.jslide.jslide.utils.FileUtils;
import exercise.jslide.jslide.view.MainView;

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>{@code Presentation} 类用于表示一个演示文稿。
 * 一个演示文稿包含多个幻灯片，每个幻灯片包含多个幻灯片元素。
 * 该类实现了 {@code Serializable} 接口，可以被序列化。</p>
 * <p>该类包含了演示文稿的标题、幻灯片列表、当前幻灯片的索引、演示速度等属性。</p>
 * <p>该类提供了创建新幻灯片、获取当前幻灯片、设置当前幻灯片索引、获取幻灯片列表等方法。</p>
 * <p>该类还包含了演示文稿文件路径、临时文件路径等属性，用于保存演示文稿。</p>
 */
public class Presentation implements Serializable {
    /**
     * 幻灯片列表
     */
    private List<Slide> slides;
    /**
     * 当前幻灯片的索引
     */
    private int currentSlideIndex;
    /**
     * 是否正在演示
     */
    private boolean isPresenting;
    /**
     * 演示速度
     */
    private int presentationSpeed;
    /**
     * 文件路径
     */
    private String presentationFilePath;
    /**
     * 临时文件路径
     */
    private String presentationTempFilePath;
    /**
     * 演示标题
     */
    private String presentationTitle;


    /**
     * 该构造方法用于初始化一个 {@code Presentation} 对象。
     * 在构造方法中，初始化了幻灯片列表 {@code slides}，
     * 同时，初始化了当前幻灯片的索引 {@code currentSlideIndex} 为 -1，并创建了第一个幻灯片。
     * 该构造方法还为演示文稿设置了一个默认的标题，以当前时间戳命名，避免重复。
     * 最后，设置了演示文稿的文件路径和临时文件路径。
     */
    public Presentation() {
        slides = new ArrayList<>();
        currentSlideIndex = -1;
        createNewSlide(); // 创建第一个幻灯片

        //设置演示文稿的默认标题，以当前时间戳命名，避免重复
        this.setPresentationTitle("JSlideTempPath"+System.currentTimeMillis());
        // 设置演示文稿的文件路径和临时文件路径
        this.setPresentationFilePath(FileUtils.createTempDirectory(this.getPresentationTitle()).getAbsolutePath());
        this.setPresentationTempFilePath(FileUtils.createTempDirectory(this.getPresentationTitle()).getAbsolutePath());

        // 创建临时文件夹
        FileUtils.mkdir(new File(getPresentationTempFilePath()+File.separator+"images"));
    }

    /**
     * 该方法用于创建一个新的幻灯片，并将其添加到幻灯片列表中。
     * 创建新的幻灯片后，将当前幻灯片的索引设置为新创建的幻灯片的索引。
     */
    public void createNewSlide() {
        Slide slide = new Slide();
        slides.add(slide);
        currentSlideIndex = slides.size() - 1;
    }

    /**
     * 该方法用于创建一个新的幻灯片，并将其添加到幻灯片列表中。
     * 创建新的幻灯片后，将当前幻灯片的索引设置为新创建的幻灯片的索引。
     * @param mainView 主视图对象，用于更新幻灯片导航器，显示新创建的幻灯片
     */
    public void createNewSlide(MainView mainView) {
        Slide slide = new Slide();
        slides.add(slide);
        currentSlideIndex = slides.size() - 1;
        mainView.getSlideNavigator().updateSlideList();
    }

    /**
     * 该方法用于获取当前幻灯片。
     * @return 如果当前幻灯片的索引在幻灯片列表的范围内，则返回当前幻灯片，否则返回 null。
     */
    public Slide getCurrentSlide() {
        if (currentSlideIndex >= 0 && currentSlideIndex < slides.size()) {
            return slides.get(currentSlideIndex);
        }
        return null;
    }

    /**
     * 该方法用于设置当前幻灯片的索引。
     * @param index 要设置的幻灯片的索引
     *              如果索引在幻灯片列表的范围内，则设置当前幻灯片的索引为 index。
     *              否则，不做任何操作。
     */
    public void setCurrentSlideIndex(int index) {
        if (index >= 0 && index < slides.size()) {
            currentSlideIndex = index;
        }
    }

    /**
     * 该方法用于获取幻灯片列表。
     * @return 返回幻灯片列表
     */
    public List<Slide> getSlides() {
        return slides;
    }

    /**
     * 该方法用于获取当前幻灯片的索引。
     * @return
     */
    public int getCurrentSlideIndex() {
        return currentSlideIndex;
    }

    /**
     * 该方法用于获取演示速度。
     * @return 返回演示速度
     */
    public void moveSlide(int fromIndex, int toIndex) {
        if (fromIndex >= 0 && fromIndex < slides.size()
                && toIndex >= 0 && toIndex < slides.size()) {
            Slide slide = slides.remove(fromIndex);
            slides.add(toIndex, slide);
        }
    }

    /**
     * 该方法用于移动幻灯片。
     * @param slide
     */
    public void removeSlide(Slide slide) {
        slides.remove(slide);
        if (slides.isEmpty()) {
            createNewSlide();
        }
    }

    /**
     * 得到文件路径
     * @return 如果临时文件路径和文件路径相同，返回null，否则返回文件路径
     */
    public String getFilePath() {
        if(presentationFilePath.equals(presentationTempFilePath)) {
            return null;
        }else {
            return presentationFilePath;
        }
    }

    /**
     * 添加幻灯片
     * @param slide 要添加的幻灯片
     */
    public void addSlide(Slide slide) {
        slides.add(slide);
    }

    /**
     * 得到当前幻灯片的文件路径
     * @return 返回当前幻灯片的文件路径
     */
    public String getPresentationFilePath() {
        return presentationFilePath;
    }

    /**
     * 设置当前幻灯片的文件路径
     * @param FilePath 要设置的文件路径
     */
    public void setPresentationFilePath(String FilePath) {
        this.presentationFilePath = FilePath;
    }

    /**
     * 得到当前幻灯片的标题
     * @return 返回当前幻灯片的标题
     */
    public String getPresentationTitle() {
        return presentationTitle;
    }

    /**
     * 设置当前幻灯片的标题
     * @param title 要设置的标题
     */
    public void setPresentationTitle(String title) {
        this.presentationTitle = title;
    }

    /**
     * 得到当前幻灯片的临时文件路径
     * @return 返回当前幻灯片的临时文件路径
     */
    public String getPresentationTempFilePath() {
        return presentationTempFilePath;
    }

    /**
     * 设置当前幻灯片的临时文件路径
     * @param tempFilePath 要设置的临时文件路径
     */
    public void setPresentationTempFilePath(String tempFilePath) {
        this.presentationTempFilePath = tempFilePath;
    }


}